# TODO: drop -E option once all filters/spatial objects/cost functions are actually wrapped
itk_python_add_test(
  NAME
  NonBlockingPythonFilterCoverage
  COMMAND
  ${CMAKE_CURRENT_SOURCE_DIR}/wrappingCoverage.py
  -E
  -b
  Filter
  -e
  ${CMAKE_CURRENT_SOURCE_DIR}/exclude-filters.txt
  ${ITK_INCLUDE_DIRS}
)
itk_python_add_test(
  NAME
  NonBlockingPythonSpatialObjectCoverage
  COMMAND
  ${CMAKE_CURRENT_SOURCE_DIR}/wrappingCoverage.py
  -E
  -b
  SpatialObject
  ${ITK_INCLUDE_DIRS}
)
if(ITK_BUILD_DEFAULT_MODULES)
  itk_python_add_test(
      NAME
      NonBlockingPythonCostFunctionCoverage
      COMMAND
      ${CMAKE_CURRENT_SOURCE_DIR}/wrappingCoverage.py
      -E
      -b
      CostFunction
      ${ITK_INCLUDE_DIRS}
  )
  itk_python_add_test(
      NAME
      PythonOptimizerCoverage
      COMMAND
      ${CMAKE_CURRENT_SOURCE_DIR}/wrappingCoverage.py
      -b
      Optimizer
      ${ITK_INCLUDE_DIRS}
  )
endif()

itk_python_add_test(
  NAME
  PythonImageIOCoverage
  COMMAND
  ${CMAKE_CURRENT_SOURCE_DIR}/wrappingCoverage.py
  -b
  ImageIO
  -e
  ${CMAKE_CURRENT_SOURCE_DIR}/exclude-imageio.txt
  ${ITK_INCLUDE_DIRS}
)
itk_python_add_test(
  NAME
  PythonTransformCoverage
  COMMAND
  ${CMAKE_CURRENT_SOURCE_DIR}/wrappingCoverage.py
  -b
  Transform
  -e
  ${CMAKE_CURRENT_SOURCE_DIR}/exclude-transform.txt
  ${ITK_INCLUDE_DIRS}
)

itk_python_add_test(
  NAME
  PythonFindEmptyClasses
  COMMAND
  ${CMAKE_CURRENT_SOURCE_DIR}/findEmptyClasses.py
)
itk_python_add_test(
  NAME
  PythonGetNameOfClass
  COMMAND
  ${CMAKE_CURRENT_SOURCE_DIR}/getNameOfClass.py
)
itk_python_add_test(
  NAME
  PythonTiming
  COMMAND
  ${CMAKE_CURRENT_SOURCE_DIR}/timing.py
)
itk_python_add_test(
  NAME
  PythonBuildOptions
  COMMAND
  ${CMAKE_CURRENT_SOURCE_DIR}/build_options.py
)
itk_python_add_test(
  NAME
  PythonVerifyGetOutputAPIConsistency
  COMMAND
  ${CMAKE_CURRENT_SOURCE_DIR}/verifyGetOutputAPIConsistency.py
)
itk_python_add_test(
  NAME
  PythonVerifyTTypeAPIConsistency
  COMMAND
  ${CMAKE_CURRENT_SOURCE_DIR}/verifyTTypeAPIConsistency.py
)
itk_python_add_test(
  NAME
  PythonTypeTest
  COMMAND
  ${CMAKE_CURRENT_SOURCE_DIR}/PythonTypeTest.py
)
itk_python_add_test(
  NAME
  PythonComplex
  COMMAND
  ${CMAKE_CURRENT_SOURCE_DIR}/complex.py
)
itk_python_add_test(
  NAME
  PythonHelperFunctions
  COMMAND
  ${CMAKE_CURRENT_SOURCE_DIR}/helpers.py
)
itk_python_add_test(
  NAME
  PythonLazyModule
  COMMAND
  ${CMAKE_CURRENT_SOURCE_DIR}/lazy.py
)
itk_python_add_test(
  NAME
  PythonNoLazyModule
  COMMAND
  ${CMAKE_CURRENT_SOURCE_DIR}/nolazy.py
)
itk_python_add_test(
  NAME
  PythonNoDefaultFactories
  COMMAND
  ${CMAKE_CURRENT_SOURCE_DIR}/nodefaultfactories.py
)
itk_python_add_test(
  NAME
  PythonDICOMSeries
  COMMAND
  ${CMAKE_CURRENT_SOURCE_DIR}/dicomSeries.py
  DATA{${ITK_DATA_ROOT}/Input/DicomSeries/Image0075.dcm}
  DATA{${ITK_DATA_ROOT}/Input/DicomSeries/Image0076.dcm}
  DATA{${ITK_DATA_ROOT}/Input/DicomSeries/Image0077.dcm}
)
itk_python_add_test(
  NAME
  PyImageFilterTest
  COMMAND
  ${CMAKE_CURRENT_SOURCE_DIR}/PyImageFilterTest.py
)
itk_python_add_test(
  NAME
  PythonConvertMetaData
  COMMAND
  ${CMAKE_CURRENT_SOURCE_DIR}/test_metadata.py
  DATA{${WrapITK_SOURCE_DIR}/images/r16slice.nii.gz}
  DATA{${WrapITK_SOURCE_DIR}/images/sourceImage.nii.gz}
  DATA{${WrapITK_SOURCE_DIR}/images/warp2D.nii.gz}
  DATA{${WrapITK_SOURCE_DIR}/images/warp3D.nii.gz}
)

# some tests will fail if dim=2 and unsigned short are not wrapped
intersection(WRAP_2 2 "${ITK_WRAP_IMAGE_DIMS}")
if(ITK_WRAP_unsigned_char AND WRAP_2)
  if(ITK_BUILD_DEFAULT_MODULES)
    itk_python_add_test(
          NAME
          PythonTypemapsTest
          COMMAND
          ${CMAKE_CURRENT_SOURCE_DIR}/PythonTypemapsTest.py
    )
    itk_python_add_test(
          NAME
          PythonTemplateTest
          COMMAND
          ${CMAKE_CURRENT_SOURCE_DIR}/PythonTemplateTest.py
    )
    itk_python_add_test(
          NAME
          PythonModifiedTimeTest
          COMMAND
          ${CMAKE_CURRENT_SOURCE_DIR}/ModifiedTime.py
    )
    itk_python_add_test(
          NAME
          PythonTemplatedPipelineTest
          TEST_DRIVER_ARGS
          --compare
          ${ITK_TEST_OUTPUT_DIR}/templated_pipeline.png
          DATA{${WrapITK_SOURCE_DIR}/images/templated_pipeline.png}
          COMMAND
          ${CMAKE_CURRENT_SOURCE_DIR}/templated_pipeline.py
          DATA{${WrapITK_SOURCE_DIR}/images/2th_cthead1.png}
          ${ITK_TEST_OUTPUT_DIR}/templated_pipeline.png
          10
    )
    itk_python_add_test(
          NAME
          PythonModuleToModuleTest
          COMMAND
          ${CMAKE_CURRENT_SOURCE_DIR}/module2module.py
          DATA{${WrapITK_SOURCE_DIR}/images/cthead1.png}
          5
    )
    itk_python_add_test(
          NAME
          PythonExtrasTest
          COMMAND
          ${CMAKE_CURRENT_SOURCE_DIR}/extras.py
          DATA{${WrapITK_SOURCE_DIR}/images/cthead1.png}
          DATA{../../../../Testing/Data/Input/mushroom.vtk}
          DATA{../../../../Testing/Data/Input/LinearTransform.h5}
          ${ITK_TEST_OUTPUT_DIR}/out.png
          ${ITK_TEST_OUTPUT_DIR}/extras-mushroom.vtk
          ${ITK_TEST_OUTPUT_DIR}
          ${ITK_TEST_OUTPUT_DIR}/LinearTransformWritten.h5
          ${ExternalData_BINARY_ROOT}/Testing/Data/Input/DicomSeries
    )
    set_tests_properties(
      PythonExtrasTest
      PROPERTIES
        DEPENDS
          PythonDICOMSeries
    )
    itk_python_add_test(
          NAME
          PythonXarrayTest
          COMMAND
          ${CMAKE_CURRENT_SOURCE_DIR}/test_xarray.py
          DATA{${WrapITK_SOURCE_DIR}/images/cthead1.png}
    )
  endif()
endif()

unique(types "${WRAP_ITK_SCALAR};UC")
# signed char can't be used to store an image with values up to 255
list(REMOVE_ITEM types SC)
foreach(d ${ITK_WRAP_IMAGE_DIMS})
  foreach(t ${types})
    itk_python_add_test(
          NAME
          PythonSimplePipeline${t}${d}
          TEST_DRIVER_ARGS
          --compare
          ${ITK_TEST_OUTPUT_DIR}/simple_pipeline${t}${d}.nrrd
          DATA{${WrapITK_SOURCE_DIR}/images/cthead1.png}
          COMMAND
          ${CMAKE_CURRENT_SOURCE_DIR}/simple_pipeline.py
          ${t}
          ${d}
          DATA{${WrapITK_SOURCE_DIR}/images/cthead1.png}
          ${ITK_TEST_OUTPUT_DIR}/simple_pipeline${t}${d}.nrrd
    )
  endforeach()
endforeach()

# Test the lazyloading in a multiprocessing environment
itk_python_add_test(
  NAME
  PythonMultiprocessLazyLoad
  COMMAND
  ${CMAKE_CURRENT_SOURCE_DIR}/multiprocess_lazy_loading.py
  DATA{${WrapITK_SOURCE_DIR}/images/cthead1.png}
  DATA{${WrapITK_SOURCE_DIR}/images/templated_pipeline.png}
  DATA{${WrapITK_SOURCE_DIR}/images/2th_cthead1.png}
)

# Test proper reading and writing of VariableLengthVector
itk_python_add_test(
  NAME
  PythonVLVReadWriteTest
  TEST_DRIVER_ARGS
  --compare
  ${ITK_TEST_OUTPUT_DIR}/TestVLV.seg.nrrd
  DATA{${WrapITK_SOURCE_DIR}/images/TestVLV.seg.nrrd}
  COMMAND
  ${CMAKE_CURRENT_SOURCE_DIR}/readWriteVLV.py
  DATA{${WrapITK_SOURCE_DIR}/images/TestVLV.seg.nrrd}
  ${ITK_TEST_OUTPUT_DIR}/TestVLV.seg.nrrd
  59
  85
  58
  5
)
